module serializer #(
    parameter N = 4  // 每个输入数据包含的8位块数量（默认N=4，对应32位输入）
) (
    input  wire                     clk,       // 时钟
    input  wire                     rst_n,     // 异步复位（低有效）
    input  wire [8*N-1:0]           data,      // 输入数据（位宽=8*N）
    input  wire                     valid,     // 输入数据有效
    output reg  [7:0]               out_data,  // 输出数据（8位）
    output reg                      out_valid  // 输出数据有效
);

reg [8*N-1:0] current_data;  // 当前正在输出的数据
reg [8*N-1:0] next_data;     // 缓存的下一个数据
reg [31:0]    cnt;           // 输出块计数器（0 到 N-1）
reg           has_next;      // 是否有缓存数据（1: 有）

// 输出数据选择（组合逻辑）
always @(*) begin
    out_data = current_data[cnt*8 +: 8];
end

// 主状态机（时序逻辑）
always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        out_valid    <= 1'b0;
        cnt          <= 0;
        current_data <= 0;
        next_data    <= 0;
        has_next     <= 1'b0;
    end else begin
        // 缓存逻辑：当有新数据且当前正在输出且不在最后一块时，缓存数据
        if (valid && out_valid && !has_next && (cnt != N-1)) begin
            next_data <= data;
            has_next  <= 1'b1;
        end

        // 输出状态处理
        if (out_valid) begin
            if (cnt == N-1) begin  // 当前数据最后一块
                out_valid <= 1'b0; // 默认下一周期停止
                cnt       <= 0;
                
                // 优先处理新输入数据（覆盖缓存）
                if (valid) begin
                    current_data <= data;
                    out_valid    <= 1'b1;
                    has_next     <= 1'b0;
                // 其次处理缓存数据
                end else if (has_next) begin
                    current_data <= next_data;
                    out_valid    <= 1'b1;
                    has_next     <= 1'b0;
                end
            end else begin
                cnt <= cnt + 1;    // 继续输出当前数据
            end
        end 
        // 空闲状态：直接启动新数据
        else if (valid) begin
            current_data <= data;
            out_valid    <= 1'b1;
            cnt          <= 0;
        end
    end
end

endmodule